--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Node / ReticulumProjects / MeshChatX.git / files / meshchatx / src / frontend / js / ToneGenerator.js
Displaying Raw • Download
meshchatx/src/frontend/js/ToneGenerator.js f2bbff5c3d5cf2eb37e75eb4607ada3987e9f65f (f2bbff5c) Text, 4.75 KB
Tff7b72export Tff7b72default Tff7b72class Te6edf3ToneGenerator Tb4b4b4{
Tff7b72constructorTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3audioCtx Tff7b72= Tff7b72nullTb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3oscillator Tff7b72= Tff7b72nullTb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3gainNode Tff7b72= Tff7b72nullTb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3timeoutId Tff7b72= Tff7b72nullTb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3currentTone Tff7b72= Tff7b72nullTb4b4b4; T8b949e// 'ringback', 'busy', or null
Tff7b72thisTb4b4b4.Te6edf3volume Tff7b72= T79c0ff0.1Tb4b4b4; T8b949e// Default volume (0.0 to 1.0 real gain)
Tb4b4b4}
Te6edf3setVolumeTb4b4b4(Te6edf3volumePercentTb4b4b4) Tb4b4b4{
T8b949e// volumePercent is 0-100
Tff7b72thisTb4b4b4.Te6edf3volume Tff7b72= Tb4b4b4(Te6edf3volumePercent Tff7b72/ T79c0ff100Tb4b4b4) Tff7b72* T79c0ff0.2Tb4b4b4; T8b949e// Cap at 0.2 real gain for safety
Tff7b72if Tb4b4b4(Tff7b72thisTb4b4b4.Te6edf3gainNode Tff7b72&& Tff7b72thisTb4b4b4.Te6edf3audioCtxTb4b4b4) Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3gainNodeTb4b4b4.Te6edf3gainTb4b4b4.Te6edf3setTargetAtTimeTb4b4b4(Tff7b72thisTb4b4b4.Te6edf3volumeTb4b4b4, Tff7b72thisTb4b4b4.Te6edf3audioCtxTb4b4b4.Te6edf3currentTimeTb4b4b4, T79c0ff0.1Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}
Te6edf3_initAudioContextTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72!Tff7b72thisTb4b4b4.Te6edf3audioCtxTb4b4b4) Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3audioCtx Tff7b72= Tff7b72new Tb4b4b4(Tffa657windowTb4b4b4.Te6edf3AudioContext Tff7b72|| Tffa657windowTb4b4b4.Te6edf3webkitAudioContextTb4b4b4)Tb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}
Te6edf3playRingbackTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72thisTb4b4b4.Te6edf3currentTone Tff7b72=== Ta5d6ff"ringback"Tb4b4b4) Tff7b72returnTb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3_initAudioContextTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3stopTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3currentTone Tff7b72= Ta5d6ff"ringback"Tb4b4b4;
Tff7b72const Te6edf3play Tff7b72= Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3osc1 Tff7b72= Tff7b72thisTb4b4b4.Te6edf3audioCtxTb4b4b4.Te6edf3createOscillatorTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3osc2 Tff7b72= Tff7b72thisTb4b4b4.Te6edf3audioCtxTb4b4b4.Te6edf3createOscillatorTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3gain Tff7b72= Tff7b72thisTb4b4b4.Te6edf3audioCtxTb4b4b4.Te6edf3createGainTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3osc1Tb4b4b4.Te6edf3frequencyTb4b4b4.Te6edf3value Tff7b72= T79c0ff440Tb4b4b4;
Te6edf3osc2Tb4b4b4.Te6edf3frequencyTb4b4b4.Te6edf3value Tff7b72= T79c0ff480Tb4b4b4;
Te6edf3gainTb4b4b4.Te6edf3gainTb4b4b4.Te6edf3value Tff7b72= Tff7b72thisTb4b4b4.Te6edf3volumeTb4b4b4;
Te6edf3osc1Tb4b4b4.Te6edf3connectTb4b4b4(Te6edf3gainTb4b4b4)Tb4b4b4;
Te6edf3osc2Tb4b4b4.Te6edf3connectTb4b4b4(Te6edf3gainTb4b4b4)Tb4b4b4;
Te6edf3gainTb4b4b4.Te6edf3connectTb4b4b4(Tff7b72thisTb4b4b4.Te6edf3audioCtxTb4b4b4.Te6edf3destinationTb4b4b4)Tb4b4b4;
Te6edf3osc1Tb4b4b4.Te6edf3startTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3osc2Tb4b4b4.Te6edf3startTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3oscillator Tff7b72= Tb4b4b4[Te6edf3osc1Tb4b4b4, Te6edf3osc2Tb4b4b4]Tb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3gainNode Tff7b72= Te6edf3gainTb4b4b4;
T8b949e// Stop after 2 seconds
Te6edf3setTimeoutTb4b4b4(Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72thisTb4b4b4.Te6edf3oscillator Tff7b72=== Te6edf3osc1 Tff7b72|| Tb4b4b4(Tffa657ArrayTb4b4b4.Te6edf3isArrayTb4b4b4(Tff7b72thisTb4b4b4.Te6edf3oscillatorTb4b4b4) Tff7b72&& Tff7b72thisTb4b4b4.Te6edf3oscillatorTb4b4b4.Te6edf3includesTb4b4b4(Te6edf3osc1Tb4b4b4)Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3gainTb4b4b4.Te6edf3gainTb4b4b4.Te6edf3exponentialRampToValueAtTimeTb4b4b4(T79c0ff0.001Tb4b4b4, Tff7b72thisTb4b4b4.Te6edf3audioCtxTb4b4b4.Te6edf3currentTime Tff7b72+ T79c0ff0.5Tb4b4b4)Tb4b4b4;
Te6edf3setTimeoutTb4b4b4(Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Te6edf3osc1Tb4b4b4.Te6edf3stopTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3osc2Tb4b4b4.Te6edf3stopTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3osc1Tb4b4b4.Te6edf3disconnectTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3osc2Tb4b4b4.Te6edf3disconnectTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3gainTb4b4b4.Te6edf3disconnectTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4, T79c0ff500Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}Tb4b4b4, T79c0ff2000Tb4b4b4)Tb4b4b4;
T8b949e// Repeat every 6 seconds
Tff7b72thisTb4b4b4.Te6edf3timeoutId Tff7b72= Te6edf3setTimeoutTb4b4b4(Te6edf3playTb4b4b4, T79c0ff6000Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4;
Te6edf3playTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Te6edf3playBusyToneTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72thisTb4b4b4.Te6edf3currentTone Tff7b72=== Ta5d6ff"busy"Tb4b4b4) Tff7b72returnTb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3_initAudioContextTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3stopTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3currentTone Tff7b72= Ta5d6ff"busy"Tb4b4b4;
Tff7b72const Te6edf3play Tff7b72= Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3osc Tff7b72= Tff7b72thisTb4b4b4.Te6edf3audioCtxTb4b4b4.Te6edf3createOscillatorTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3gain Tff7b72= Tff7b72thisTb4b4b4.Te6edf3audioCtxTb4b4b4.Te6edf3createGainTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3oscTb4b4b4.Te6edf3frequencyTb4b4b4.Te6edf3value Tff7b72= T79c0ff480Tb4b4b4;
Te6edf3gainTb4b4b4.Te6edf3gainTb4b4b4.Te6edf3value Tff7b72= Tff7b72thisTb4b4b4.Te6edf3volumeTb4b4b4;
Te6edf3oscTb4b4b4.Te6edf3connectTb4b4b4(Te6edf3gainTb4b4b4)Tb4b4b4;
Te6edf3gainTb4b4b4.Te6edf3connectTb4b4b4(Tff7b72thisTb4b4b4.Te6edf3audioCtxTb4b4b4.Te6edf3destinationTb4b4b4)Tb4b4b4;
Te6edf3oscTb4b4b4.Te6edf3startTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3oscillator Tff7b72= Te6edf3oscTb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3gainNode Tff7b72= Te6edf3gainTb4b4b4;
T8b949e// Stop after 0.5 seconds
Te6edf3setTimeoutTb4b4b4(Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72thisTb4b4b4.Te6edf3oscillator Tff7b72=== Te6edf3oscTb4b4b4) Tb4b4b4{
Te6edf3oscTb4b4b4.Te6edf3stopTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3oscTb4b4b4.Te6edf3disconnectTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3gainTb4b4b4.Te6edf3disconnectTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}Tb4b4b4, T79c0ff500Tb4b4b4)Tb4b4b4;
T8b949e// Repeat every 1 second
Tff7b72thisTb4b4b4.Te6edf3timeoutId Tff7b72= Te6edf3setTimeoutTb4b4b4(Te6edf3playTb4b4b4, T79c0ff1000Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4;
Te6edf3playTb4b4b4(Tb4b4b4)Tb4b4b4;
T8b949e// Auto-stop busy tone after 4 seconds (4 cycles)
Te6edf3setTimeoutTb4b4b4(Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tff7b72thisTb4b4b4.Te6edf3stopTb4b4b4(Tb4b4b4)Tb4b4b4, T79c0ff4000Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Te6edf3stopTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3currentTone Tff7b72= Tff7b72nullTb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72thisTb4b4b4.Te6edf3timeoutIdTb4b4b4) Tb4b4b4{
Te6edf3clearTimeoutTb4b4b4(Tff7b72thisTb4b4b4.Te6edf3timeoutIdTb4b4b4)Tb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3timeoutId Tff7b72= Tff7b72nullTb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Tff7b72thisTb4b4b4.Te6edf3oscillatorTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tffa657ArrayTb4b4b4.Te6edf3isArrayTb4b4b4(Tff7b72thisTb4b4b4.Te6edf3oscillatorTb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3oscillatorTb4b4b4.Te6edf3forEachTb4b4b4(Tb4b4b4(Te6edf3oscTb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72try Tb4b4b4{
Te6edf3oscTb4b4b4.Te6edf3stopTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72catch Tb4b4b4{
T8b949e// Ignore errors if oscillator is already stopped or disconnected
Tb4b4b4}
Tff7b72try Tb4b4b4{
Te6edf3oscTb4b4b4.Te6edf3disconnectTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72catch Tb4b4b4{
T8b949e// Ignore errors if oscillator is already disconnected
Tb4b4b4}
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72else Tb4b4b4{
Tff7b72try Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3oscillatorTb4b4b4.Te6edf3stopTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72catch Tb4b4b4{
T8b949e// Ignore errors if oscillator is already stopped or disconnected
Tb4b4b4}
Tff7b72try Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3oscillatorTb4b4b4.Te6edf3disconnectTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72catch Tb4b4b4{
T8b949e// Ignore errors if oscillator is already disconnected
Tb4b4b4}
Tb4b4b4}
Tff7b72thisTb4b4b4.Te6edf3oscillator Tff7b72= Tff7b72nullTb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Tff7b72thisTb4b4b4.Te6edf3gainNodeTb4b4b4) Tb4b4b4{
Tff7b72try Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3gainNodeTb4b4b4.Te6edf3disconnectTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72catch Tb4b4b4{
T8b949e// Ignore errors if gain node is already disconnected
Tb4b4b4}
Tff7b72thisTb4b4b4.Te6edf3gainNode Tff7b72= Tff7b72nullTb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────